PD分离的讨论
Mooncake的工作引发了PD分离的研究热潮。知乎也有很多相关的讨论,在此总结一些比较精华的思想。
计算和存储的分层
KV Cache Memory Pool会从推理系统中剥离出来,专门管理不同内存下的KV Cache。这个也是一种解耦的思想。
这里可能涉及到的功能有:
- 查找prompt在memory pool中的最长可复用前缀的KV Cache
- 规划这类KV Cache到Prefill KV cache的搬运
- 规划Prefill-Decode Instance之间的KV Cache搬运
- 规划Memory Pool的Cache Eviction策略。
新的GPU硬件集群设计
目前一般来说集群配置是节点内NVLink,节点间用RDMA,对于PD分离的讨论来说比较浪费。
Prefill子集群,用A800/H800高算力卡计算,节点用PCIe互联做TeraPipe式的流水并行或者Ring 方式 SP,Decode节点间可以用以太网交换机来交换KVCache,比如100Gbps的VPC(一秒钟P2P搬运12.5GB KVCache)没准也足够。
Decode子集群,用H20高内存高带宽卡计算,节点内可能需要NVLink做SP/TP方式解码计算,Decode节点间不需要配网络,因为没有Decode Instance间的KVCache搬运需求。
Prefill-Decode Instance之间,用N:M互联的RDMA网络来传输Prefill和Decode之间的KVCache,这个需要高带宽低延迟。这种偏序方式连接,相比用FatTree式全互联的训练集群可以拆掉一些交换机,节省硬件成本。(我不知道这是不是Butterfly式互联?)
Prefill和Decode Instance的弹性扩缩容
从MoonCake看大模型推理的PD分离,太快会扯到蛋吗? - 知乎
肯定了前提:PD分离这种解耦的思想肯定能增加可拓展性。并且从商业模式看,这种转变会带来更良性的商业模式,prefill不应该进行定价,正如用户不应该为系统“学习”自己的喜好买单。
PD 分离的不同层次
Level -1:P和D在一张卡上融合,算是和PD分离反着来的一种设计 Level 0:P和D分别计算,但还是在一张卡上调度,这是目前主流框架的默认玩法 Level 1:在同构设备同构网络中分离P和D,比如在一个H20节点内搞,不用改造现有集群 Level 2:把P和D分到同构设备但异构网络中,比如P和D各占一个H20节点,需要高速互联但不用改造集群 Level 3:干脆把P和D放在异构设备上,比如用昇腾910跑P,H20跑D,这个就得改造集群加高速互联了
Mooncake (1): 在月之暗面做月饼,Kimi 以 KVCache 为中心的分离式推理架构 - 知乎
章明星老师对chunked prefill提出后pd分离进行了讨论。他也同意chunked prefill可以让prefill decode节点的边界变得更加模糊。但他认为除非不用chunk都能直接prefill,不然他更加倾向于使用独立的prefill节点。他主要从两个角度提出他的想法:
VRAM occupation cost
第一点是KVCache 大小乘以其在显存中留驻的时间。使用 chunked prefill 的话由于每个 chunk 还需要和其他 decode request batch 在一起处理因此是显著增加了对应 KVCache 在显存中留驻的时间的,因此等效的降低了宝贵显存空间的利用率。
长文本场景下我们需要在 Prefill 集群中使用特殊的多节点分布式划分方法来压低 TTFT。相比现在被讨论的更多的 SP 策略直接使用 Chunked PP 策略在调度和减少通讯量方面的优越性,前者大幅度简化架构,后者则能够省出宝贵的传输带宽来搬运 KVCache。具体策略其实就是 TeraPipe 的推理简化版本,因为只有 forward 没有 backword 的话不需要啥动态规划来平衡每个 Chunk 的计算量,只要给每个 Chunk 设置一个最小的值就行。
看完后我认为第一点是需要进一步探究的。总的KV Cache空间是一样的,PD分离将Cache空间分为了两份,但是chunked prefill可以复用资源,虽然chunked prefill的TPOT可能会更长,但直观上应该是chunked prefill对资源的使用是更好的。
第二点需要了解后再进行探讨。
PD分离的原因:
- 商业模式
- Prefill和Decode计算特性不同
- 可以用不同的卡
- 用不同的并行模式,特别是长文本Prefill需要PP或SP,而Decode一般是采取TP的方法。
- Prefill可能需要跨instance,这种管理对
- Prefill和Decode的服务目标不同
- Prefill重视TTFT
- Decode重视TPOT
- 在极致性能上PD分离是可以降低系统成本
PD分离会带来一些问题:
- PD节点之间KV Cache的通信
- Prefill完可能没有空间Decode,这里需要一个Early Admission,或者涉及一些资源浪费。
- multi term会带来Cache复用问题,比如一个节点的KV Cache需要在另外一个节点上恢复。
- 对资源的可复用性比较小的,并且部署只针对特定大模型背景的云系统风险很大,算法改变就可能造成浪费,比如Transformer的没落,或者新的并行模式,都可能造成硬件系统的浪费